package log

// 日志钩子
// 注意,在实现上没有单独开启goroutine或channel来触发`Fire()`函数,需要避免阻塞
type Hook interface {
	Levels() []Level // 返回需要被触发的日志等级
	Fire(*Entry)
}

// 分等级根据添加顺序记录日志钩子
type LevelHooks map[Level][]Hook

// 添加一个日志钩子
func (hooks LevelHooks) Add(hook Hook) {
	for _, level := range hook.Levels() {
		hooks[level] = append(hooks[level], hook)
	}
}

// 触发指定等级的日志钩子
func (hooks LevelHooks) Fire(level Level, entry *Entry) {
	for _, hook := range hooks[level] {
		hook.Fire(entry)
	}
}
